package com.httpDemo.config;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import org.springframework.context.annotation.Configuration;
import org.springframework.format.Formatter;
import org.springframework.format.FormatterRegistry;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import com.httpDemo.interceptor.MyInterceptor;

/**
 * springMvc组件的管理和扩展
 * 
 * @author 86173
 *
 */
@Configuration // 申明这是一个配置类
public class MyWebConfig implements WebMvcConfigurer {

	/**
	 * 注册静态资源地址
	 */
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		/**
		 * registry可注册多个， 第一个参数是url地址， 第二个参数当有匹配到这个url之后指定访问项目的资源目录，该参数可多个，越前面优先级越高
		 */
		registry.addResourceHandler("/**").addResourceLocations("classpath:gzp/", "classpath:static/");
		registry.addResourceHandler("/gzp/**").addResourceLocations("classpath:gzp/");
		// 解决swagger页面被拦截的问题
		registry.addResourceHandler("swagger-ui.html", "doc.html")
				.addResourceLocations("classpath:/META-INF/resources/");
		registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
	}

	/**
	 * 注册视图控制器 此控制器可以不需要通过controller便可访问到templates下的html页面或者WEB-INF下的jsp页面
	 */
	@Override
	public void addViewControllers(ViewControllerRegistry registry) {
		/**
		 * 第一个参数是url地址，第二个参数是html或者jsp页面，不需要加前缀和后缀
		 */
		registry.addViewController("/hello/jsp").setViewName("hellojsp");
	}

	/**
	 * 注册格式化器 将前端传过来的String值转换成后台能够接收的类型
	 */
	@Override
	public void addFormatters(FormatterRegistry registry) {
		/**
		 * 日期格式化 如果不想配置spring.mvc.format.date和@DateTimeFormat，可在此处配置，优先级更高。
		 */
		registry.addFormatter(new Formatter<Date>() {

			@Override
			public String print(Date object, Locale locale) {
				return null;
			}

			@Override
			public Date parse(String text, Locale locale) throws ParseException {
				SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				return format.parse(text);
			}

		});
		/**
		 * Integer格式化
		 */
		registry.addFormatter(new Formatter<Integer>() {

			@Override
			public String print(Integer object, Locale locale) {
				return null;
			}

			@Override
			public Integer parse(String text, Locale locale) throws ParseException {
				Integer i = 0;
				try {
					i = Integer.parseInt(text);
				} catch (Exception e) {
					System.out.println("错误信息：" + e.getMessage());
				}
				return i;
			}

		});
	}

	/**
	 * 注册转化器 将后台的值转化成json格式返回给前端
	 */
	@Override
	public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
		FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
		// 下面的配置可不设置，因为有默认值
		FastJsonConfig config = new FastJsonConfig();
		// 设置序列化的方法
		config.setSerializerFeatures(SerializerFeature.PrettyFormat);
		// 解决中文乱码问题
//		List<MediaType> fastMediaTypes = new ArrayList<>();
//        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
//        converter.setSupportedMediaTypes(fastMediaTypes);
		converter.setFastJsonConfig(config);
		converters.add(converter);
	}

	/**
	 * 注册拦截器
	 */
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// 创建拦截器对象
		MyInterceptor interceptor = new MyInterceptor();
		// 注册
		registry.addInterceptor(interceptor)
				// 设置拦截路径，所有路径都拦截
				.addPathPatterns("/**")
				// 设置放行路径
				.excludePathPatterns("/hello/jsp");
	}
}
